#ifndef EGE_CORE_H

#include <cstdint>

struct XEGE_ColorF {
    float a, r, g, b;
};

// ARGB 颜色类型;
typedef uint32_t XEGE_Color;

struct XEGE_Point2 {int x, y;};

typedef size_t XEGE_Index;

struct XEGE_Texture {
    /* unimplemented */
};

enum XEGE_ColorFormat {
    ARGB_INT,
    ARGB_FLOAT
};

// *实现必须提供的函数*

// 获取纹理指针
void* XEGE_GetBuffer(XEGE_Texture t);

// 获取纹理宽
int XEGE_GetWidth(XEGE_Texture t);

// 获取纹理高
int XEGE_GetHeight(XEGE_Texture t);

// 判断函数是否存在
bool funcExsit(char* name);
bool funcExsit(wchar_t* name);

// 创建绘图环境（不需要模式）
void initGraph(int w, int h, int mode);

// 关闭绘图环境
void closeGraph();

// *可选输入函数*

// 获得鼠标相对于窗口的坐标
bool XEGE_GetMouseXY(int& x, int& y);

// 获取鼠标瞬时状态，分别表示左键状态、右键状态、中键值
bool XEGE_GetMouseStates(bool& l, bool& r, int& w);

// 判断key键的状态，类似鼠标，暂时使用windows虚拟键值表
bool XEGE_GetKeyState(bool& state, int key);

// *可选绘图函数*

// 颜色
XEGE_ColorF setColor(XEGE_ColorF c);
XEGE_Color setColor(XEGE_Color c);

// 填充色
XEGE_ColorF setFillColor(XEGE_ColorF c);
XEGE_Color setFillColor(XEGE_Color c);

// 颜色
XEGE_ColorF XEGE_GetColorF();
XEGE_Color XEGE_GetColor();

// 填充色
XEGE_ColorF XEGE_GetFillColorF();
XEGE_Color XEGE_GetFillColor();

// 点
bool XEGE_DrawPoint(XEGE_Point2 p);

// 使用线宽的直线
bool XEGE_DrawLineW(XEGE_Point2 p1, XEGE_Point2 p2);

// 直线
bool XEGE_DrawLine(XEGE_Point2 p1, XEGE_Point2 p2);

// 画不填充圆
bool XEGE_DrawCircle(XEGE_Point2 center, int radius);

// 画不填充矩形
bool XEGE_DrawRect(XEGE_Point2 a, XEGE_Point2 b);

// 画不填充椭圆
bool XEGE_DrawEllipse(XEGE_Point2 a, XEGE_Point2 b);

// 画不填充矩形，b是端点而不是长宽
bool XEGE_DrawRect(XEGE_Point2 a, XEGE_Point2 b);

/* 其他XEGE_Draw  绘制其他不填充图形 */

// 画填充圆
bool XEGE_FillCircle(XEGE_Point2 a, int radius);

/* 其他XEGE_Fill  绘制其他填充图形（参数类似XEGE_Draw类） */

// 设置字体
bool setFont(/* unimplemented */);

// 获得当前字体
bool XEGE_GetFont(/* unimplemented */);

// 指定位置输出字符串
bool XEGE_OutTextXY(/* unimplemented */);

// 绘制纹理
bool XEGE_DrawTexture(XEGE_Texture t);

// 从src中截取到dest，坐标参数同rect
bool XEGE_LoadTexture(XEGE_Texture& dest, XEGE_Texture src, XEGE_Point2 a, XEGE_Point2 b);

// 从文件读Texture，a、b表示截取的范围
bool XEGE_LoadTexture(XEGE_Texture& dest, char* filename, XEGE_Point2 a, XEGE_Point2 b);
bool XEGE_LoadTexture(XEGE_Texture& dest, wchar_t* filename, XEGE_Point2 a, XEGE_Point2 b);


#define EGE_CORE_H
#endif
